iT邦幫忙

2021 iThome 鐵人賽

DAY 7
1
Software Development

從 JavaScript 角度學 Python系列 第 7

從 JavaScript 角度學 Python(7) - 條件與迴圈

  • 分享至 

  • xImage
  •  

前言

接下來是聊條件與迴圈的部分,畢竟寫程式這兩個東西非常常使用到。

條件控制

條件控制的語法又可以稱之為判斷式、決策(?)等等,反正就統稱條件式,也就是你熟悉的 if...else 啦。

通常來講我們在 JavaScript 是非常常使用 ifif/elseif/else if/else 語法來做條件式判斷,當條件成立時,就會走特定的 { ... } 內容,所以這邊簡單舉例一下例子好了。

舉例來講,如果現在天氣晴朗的話,我要出現「天氣好棒!」,如果天氣不好的話,要出現「天氣好差!」的字眼:

var now = true;

if(now) {
  console.log('天氣好棒!');
} else {
  console.log('天氣好差!');
}

上面是一個非常簡單的 JavaScript if/else 條件式判斷,若希望條件多一點的話,則是使用 if/else if/else

var myName = 'Ray';

if(myName === 'QQ') {
  console.log('哈囉 QQ');
} else if (myName === 'Ray') {
  console.log('哈囉 Ray');
} else if(myName === 'Hello') {
  console.log('哈囉');
} else {
  console.log('都不熟');
}

那麼 Python 呢?寫法上會有差異嗎?先讓我們看看 if/else 部分:

now = True
if now:
  print('天氣好棒!')
else:
  print('天氣好差!')

看起來沒什麼差別對吧?但是在 if/else if/else 撰寫上 Python 就會有那麼一點點差異。

在 Python 中不是 if/else if/else 而是 if/elif/else

(注意 Python 中並沒有三等號運算子,在 JavaScript 中會有這個功能主要原因是隱含轉型導致,但在 Python 不會有這個狀況,通常你必須自己轉型。)

myName = 'Ray'

if myName == 'QQ':
  print('哈囉 QQ')
elif myName == 'Ray':
  print('哈囉 Ray')
elif myName == 'Hello':
  print('哈囉')
else:
  print('都不熟')

題外話一下 Python 中沒有 Switch/Case 的寫法,但是網路上依然查得到相當多的解決方案,所以這邊就不特別拉出來講了。

目前 Python 3.10 版本已經有推出類似 switch 的語法叫做 match,用法也與 switch 很像:

myName = 'Ray'

match myName:
  case 'QQ':
    print('哈囉 QQ')
  case 'Ray':
    print('哈囉 Ray')

剩下對於 match 有興趣的話,可以閱讀 官方 文件。

對了,Python 的 if/else 在做條件判斷時,並不需要使用 () 包覆,但是如果你使用 () 也是可以:

now = True
if (now):
  print('天氣好棒!')
else:
  print('天氣好差!')

那麼為什麼不會出錯呢?最主要是 if 的條件只接受表達式,剛好 () 會優先執行後回傳裡面的內容,因此才不會出現錯誤,並不是代表著兩種寫法都可以這一點可以稍微注意一下,你不信?你可以試著輸入以下程式碼,看它會出現 (1) 還是 1

print((1))

你嘗試了嗎?我覺得應該沒有。

https://ithelp.ithome.com.tw/upload/images/20210907/20119486krJKuWI1Tl.png

所以我這邊補充一下,如果上面的定論是一個錯誤的說法的話,那麼上方 print 正常來講會直接輸出 (1),但實際上是會出現 1,因此可以驗證並不是 Python 可以接受 if (True) 的寫法,而是 () 回傳一個結果給了 if/else 條件式哩。

迴圈

接下來聊聊迴圈的部分,迴圈在 JavaScript 中有滿多種寫法,像是 for loopfor...in 或者是 forEach 等等非常多,滿多都是跟陣列操作有關係,所以這邊也推薦我先前寫的 關於 JavaScript 陣列20種操作的方法,這一篇要感謝偷米騎巴哥老師的整理,這邊有興趣的人可以直接觀看那篇文章,這邊就不再著墨了。

那麼讓我們先看一段簡單的 JavaScript for loop 範例:

for(var i = 0; i < 10; i+=1){
  console.log(i); // 0...1...2......9
}

上面程式碼的預期結果會出現 0~9,那麼 Python 的迴圈該如何撰寫呢?主要寫法 for...in 的寫法,但是如果想要達到上方相同作法的話,這邊就必須使用 Python 的內建方法 range() 來產生一個陣列範圍,你可以把它想像成原本自己要手打 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],但是透過 range() 你可以快速生成一個陣列的概念:

for i in range(10):
  print(i)

這邊簡單聊一下關於 range() 這個函式有哪些功用,基本上依據你傳入的參數量可以得到不同的結果

  • range(10) - 產生 0~9 的範圍
  • range(2, 10) - 產生 2~9 的範圍
  • range(2, 10, 4) - 產生遞增範圍 4,,以這個範例來講起始值是 2,因此會 2 + 4 = 6,但是因為 6 + 4 超過 range() 範圍,因此只會出現 2 跟 6。

當然你也可以直接傳入一個陣列來跑迴圈也是完全沒有問題的:

for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
  print(i)

但我相信你不會想要這樣寫程式的,除非你真的很猛

https://ithelp.ithome.com.tw/upload/images/20210907/20119486blK4Im8v6I.png

對了,你也可以試著撰寫面試常見的 9x9 考題,答案我就留到最後再公佈吧。

這邊也額外提一個好玩的地方,如果 for loop 所傳入的是一個字串,迴圈是將字串變成一個一個單字取出:

for i in 'Ray':
  print(i)

https://ithelp.ithome.com.tw/upload/images/20210907/20119486o7qwAbGnhZ.png

除此之外還有另一種迴圈寫法是 while loop,我先承認我自己在 JavaScript 中是比較少使用這種寫法,之前寫也常常寫出死迴圈(怕)

https://ithelp.ithome.com.tw/upload/images/20210907/20119486B0IvXTObOj.png

回歸正題,那麼先聊聊 JavaScript 中 while loop 是怎麼寫的:

var i = 0;
while(i < 5) {
  i += 1;
  console.log('Hello Ray' + i);
}

另一種 while 則是 do...while

var i = 0;
do {
  i += 1;
  console.log('Hello Ray' + i);
} while(i < 5) 

基本上這兩者呈現的結果是非常相似,都是 Hello Ray 1...5,但是 do...while 中的 do 不管條件是否成立,必定會執行一次:

var i = 0;
do {
  i += 1;
  console.log('Hello Ray' + i);
} while(i < 0); // Hello Ray1

var i = 0;
// 條件不符合不執行
while(i < 0) {
  i += 1;
  console.log('Hello Ray' + i);
}

反觀我們來看看 Python 中的 while loop 寫法會不會有所不同呢?讓我們繼續看下去:

i = 0
while i < 5:
  i += 1
  print('Hello Ray' + str(i))

基本上感覺差異是不大,但是這邊可以額外提一下 Python 是沒有 do...while 語法的,可是我們可以模擬一個 do....while 類似的運作寫法出來:

i = 0
status = True

while status:
  i += 1
  print('Hello Ray' + str(i))
  if i >= 0:
    status = False

透過上述寫法我們就可以很簡單的達到與原本 do...while 類似的寫法,也就是不管條件語法必定會執行一次這件事情。

但是請務必要小心下面這種沒有結束條件的寫法,是很容易出現死迴圈的:

i = 0
while True:
  print(i)
  i += 1

這種寫法上要格外小心,在此建議不要當 7474 團(去死去死團)拿自己電腦冒險 QQ

九九乘法表 Python 答案

基本上就是用兩個迴圈就可以做到了:

for i in range(2, 10):
  for j in range(2, 10):
    print(str(i) + 'x' + str(j) + '=' + str(i*j))

而上方寫法又稱之為「Nested For Loop」,也就是巢狀迴圈,通常在初學時滿容易混亂的。

這邊也簡單描述一下運作邏輯,第一層的 for loop 在執行時,第二層 for loop 會跑九次(0~9),第二層 for loop 跑完之後記憶體會被釋放掉,然後再跑第一層 for loop,以此類推。

作者的話

稍微嘗試了一下將雞肉捲起來做花雕醉雞,身邊親人與朋友吃完之後都說不輸給外面賣的,看來我替自己的未來找到第二片春天了...

關於兔兔們

兔法無邊


上一篇
從 JavaScript 角度學 Python(6) - 變數作用域
下一篇
從 JavaScript 角度學 Python(8) - BMI 計算(1)
系列文
從 JavaScript 角度學 Python31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言